package cn.bdqn.sp.controller;

import cn.bdqn.sp.pojo.SysRole;
import cn.bdqn.sp.pojo.SysUser;
import cn.bdqn.sp.service.SysRoleService;
import cn.bdqn.sp.service.SysUserService;
import cn.bdqn.sp.utils.Constants;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/user")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    @Autowired
    private SysRoleService sysRoleService;

    @PostMapping("/login")
    public String doLogin(@RequestParam String account,
                          @RequestParam String password,
                          Model model,
                          HttpSession session) {
        // 调用service的方法，进行用户匹配
        SysUser user = sysUserService.login(account, password);

        session.setAttribute(Constants.SESSION_USER, user);
        return "redirect:/user/toMain";

        // 判断是否查询出数据
//        if (user != null) {
//            // 成功
//            // user/toMain.jsp
//            // 当前登录用户信息带到前端
//            session.setAttribute(Constants.SESSION_USER,user);
//            return "redirect:/user/toMain";
//        } else {
//            // 失败
//            // request.setAttribute("error","用户名或密码错误！")
////            model.addAttribute("error","用户名或密码错误！");
////            return "login";
//            // 按照用户名查询
//            throw new RuntimeException("用户名或密码错误！");
//        }
    }

    @RequestMapping("/toMain")
    public String main(HttpSession session) {
        if (session.getAttribute(Constants.SESSION_USER) == null) {
            return "login";
        }
        return "frame";
    }

    @RequestMapping("/list")
    public String goToList(@RequestParam(required = false, defaultValue = "1") Integer pageNum,
                           Model model,
                           SysUser sysUser) {
        // 1.查询用户信息并且分页
        PageHelper.startPage(pageNum, 5);
        List<SysUser> users = sysUserService.getUsers(sysUser);

        // 2.将结果封装进PageInfo
        PageInfo<SysUser> pageInfo = new PageInfo<>(users);

        // 3.将最终结果pageInfo带到前端页面
        model.addAttribute("pageInfo", pageInfo);

        // 查询角色
        List<SysRole> roles = sysRoleService.getRoles();

        // 将角色集合放入model当中
        model.addAttribute("roles", roles);

        // 回显
        // 将条件原封不动的放入model中
        model.addAttribute("sysUser", sysUser);

        return "list";
    }

    @GetMapping("/toAdd")
    public String toAdd(Model model) {
        // 查出下拉菜单的角色信息
        // 查询角色
        List<SysRole> roles = sysRoleService.getRoles();

        // 将角色集合放入model当中
        model.addAttribute("roles", roles);
        return "sysUser/add";
    }

    @PostMapping("/add")
    public String add(SysUser sysUser,
                      HttpSession session,
                      @RequestParam(value = "muFiles", required = false) MultipartFile[] muFiles,
                      Model model) {

        // 遍历这些文件
        int i = 0;
        for (MultipartFile idPic : muFiles) {
            // 如果有上传文件
            if (!idPic.isEmpty()) {
                // 开始处理上传
                // 获取这个项目所在的一个位置，在这个位置创建空白文件
                String path = session.getServletContext().getRealPath("statics" + File.separator + "uploadfiles");

                // 2.给这个空白文件取个名字
                // 当前时间的毫秒数
                // .jpg .png .pneg .jpeg
                // 从上传过来的文件名中获取扩展名
                String oldFileName = idPic.getOriginalFilename(); // 获取上传文件的文件名
                String extension = FilenameUtils.getExtension(oldFileName);

                String fileName = System.currentTimeMillis() + "." + extension;

                // 3.判断这个文件大小不能超标
                // 获取这个文件的大小
                if (idPic.getSize() > 500000) {
                    // 返回错误，文件过大
                    model.addAttribute("uploadFileError", "* 上传大小不得超过500KB");
                    return "sysUser/add";
                } else if ("jpg".equals(extension)
                        || "png".equals(extension)
                        || "jpeg".equals(extension)
                        || "pneg".equals(extension)) {
                    // 上传文件必须是这四个其中之一
                    // 上传操作
                    // 1.创建一个空白文件
                    File file = new File(path, fileName);

                    // 2如果说这个文件夹不存在，那么需要创建出来
                    if (!file.exists()) {
                        file.mkdirs(); // 创建文件夹
                    }

                    try {
                        idPic.transferTo(file);
                    } catch (IOException e) {
                        model.addAttribute("uploadFileError", "* 上传失败");
                        e.printStackTrace();
                        return "sysUser/add";
                    }

                    // 还需要把上传成功地址记录到数据库当中
                    if (i == 0)
                        sysUser.setIdPicPath("http://localhost:8080/statics/uploadfiles/" + fileName);
                    if (i == 1)
                        sysUser.setWorkPicPath("http://localhost:8080/statics/uploadfiles/" + fileName);

                } else {
                    model.addAttribute("uploadFileError", "* 上传图片格式不正确");
                    return "sysUser/add";
                }

            }
            i++;
        }


        // 1.获取当前登录的账号，作为注册人
        SysUser user = (SysUser) session.getAttribute(Constants.SESSION_USER);
        Long id = user.getId();
        sysUser.setCreateduserid(id);
        // 2.创建时间，当前时间
        sysUser.setCreatedtime(new Date());
        // 3.插入数据
        int rs = sysUserService.addUser(sysUser);

        if (rs > 0) {
            // 成功
            return "redirect:/user/list";
        } else {
            // 失败
            return "redirect:/user/toAdd";
        }
    }

//    @GetMapping("/view/{id}")
//    public String viewUser(@PathVariable Long id, Model model) {
//        // 按照主键查询用户信息
//        SysUser sysUser = sysUserService.getUserById(id);
//
//        model.addAttribute("sysUser", sysUser);
//
//        // 跳转到查询结果页面
//        return "sysUser/view";
//    }

    @RequestMapping(value = "/view/{id}")
    @ResponseBody
    public Object viewUser(@PathVariable Long id) {
        // 按照主键查询用户信息
        SysUser sysUser = sysUserService.getUserById(id);

        return sysUser;
    }

    @GetMapping("/update/{id}")
    public String toUpdate(@PathVariable Long id, Model model) {

        // 按照主键查询用户信息
        SysUser sysUser = sysUserService.getUserById(id);

        model.addAttribute("sysUser", sysUser);

        // 查询角色
        List<SysRole> roles = sysRoleService.getRoles();

        // 将角色集合放入model当中
        model.addAttribute("roles", roles);

        return "sysUser/update";
    }


    @PutMapping("/{id}")
    public String update(@PathVariable Long id, SysUser sysUser) {
        // 1.将传过来的id设置到sysUser中
        sysUser.setId(id);
        // 2. 调用service来进行更新
        int rs = sysUserService.updateUser(sysUser);

        // 3. 根据结果判断跳转哪个页面
        if (rs > 0) {
            return "redirect:/user/list";
        } else {
            return "redirect:/user/update/" + id;
        }
    }

    @DeleteMapping("/{id}")
    @ResponseBody
    public String delete(@PathVariable Long id) {
        // 1. 删除
        int rs = sysUserService.deleteUser(id);

        // 2. 依据删除结果，进行返回结果
        if (rs > 0) {
            return "ok";
        } else {
            return "error";
        }
    }

    @RequestMapping("/repassword")
    public String toUpdatePassword() {
        return "sysUser/updatePassword";
    }

    @PostMapping("/pwd")
    public String updatePassword(String oldPassword,
                                 String newPassword,
                                 HttpSession session,
                                 Model model) {
        // 1.调用service
        try {
            // 从session中取出账号信息
            SysUser sysUser = (SysUser) session.getAttribute(Constants.SESSION_USER);
            int rs = sysUserService.updatePassword(sysUser.getAccount(), oldPassword, newPassword);
            // 3.登出，重新登录
            return "redirect:/user/logout";
        } catch (RuntimeException e) {
            model.addAttribute("error", e.getMessage());
            return "sysUser/updatePassword";
        }
    }

    @RequestMapping("/logout")
    public String logout(HttpSession session) {
        session.invalidate();
        return "redirect:/";
    }

    @RequestMapping("/check")
    @ResponseBody
    public String checkAccount(String account) {
        SysUser sysUser = sysUserService.getUserByAccount(account);

        Map<String, Object> data = new HashMap<>();

        // 需要判断数据库中有没有这个账号的数据
        // {"exist": 1} 存在
        // {"exist": 0} 不存在
        if (sysUser == null) {
            data.put("exist", 0);
        } else {
            data.put("exist", 1);
        }

        String json = JSON.toJSONString(data);

        return json;
    }

    @ExceptionHandler
    public String exceptionHandler(RuntimeException e, HttpServletRequest request) {
        // 处理异常
        request.setAttribute("error", e);
        return "login";
    }


}
